<?php

class PersonaController extends CController
{
	
	const PAGE_SIZE=10;
	/**
	 * @var string specifies the default action to be 'list'.
	 */
	public $defaultAction='list';

	/**
	 * @var CActiveRecord the currently loaded data model instance.
	 */
	private $_persona;
	
	/**
	 * @var array con los tipos de parentesco
	 */
	private $_tipos=array(
				ArbolHelper::PARENTESCO_HERMANO=>ArbolHelper::LABEL_HERMANO,
				ArbolHelper::PARENTESCO_PADRE=>ArbolHelper::LABEL_PADRE,
				ArbolHelper::PARENTESCO_MADRE=>ArbolHelper::LABEL_MADRE,
				ArbolHelper::PARENTESCO_ABUELO_PATERNO=>ArbolHelper::LABEL_ABUELO_PATERNO,
				ArbolHelper::PARENTESCO_ABUELA_PATERNA=>ArbolHelper::LABEL_ABUELA_PATERNA,
				ArbolHelper::PARENTESCO_ABUELO_MATERNO=>ArbolHelper::LABEL_ABUELO_MATERNO,
				ArbolHelper::PARENTESCO_ABUELA_MATERNA=>ArbolHelper::LABEL_ABUELA_MATERNA,
				ArbolHelper::PARENTESCO_HERMANO_ABUELO_PATERNO=>ArbolHelper::LABEL_HERMANO_ABUELO_PATERNO,
				ArbolHelper::PARENTESCO_HERMANO_ABUELA_PATERNA=>ArbolHelper::LABEL_HERMANO_ABUELA_PATERNA,
				ArbolHelper::PARENTESCO_HERMANO_ABUELO_MATERNO=>ArbolHelper::LABEL_HERMANO_ABUELO_MATERNO,
				ArbolHelper::PARENTESCO_HERMANO_ABUELA_MATERNA=>ArbolHelper::LABEL_HERMANO_ABUELA_MATERNA,
				ArbolHelper::PARENTESCO_PADRE_ABUELA_MATERNA=>ArbolHelper::LABEL_PADRE_ABUELA_MATERNA,
				ArbolHelper::PARENTESCO_MADRE_ABUELA_MATERNA=>ArbolHelper::LABEL_MADRE_ABUELA_MATERNA,
				ArbolHelper::PARENTESCO_PADRE_ABUELO_MATERNO=>ArbolHelper::LABEL_PADRE_ABUELO_MATERNO,
				ArbolHelper::PARENTESCO_MADRE_ABUELO_MATERNO=>ArbolHelper::LABEL_MADRE_ABUELO_MATERNO,
				ArbolHelper::PARENTESCO_PADRE_ABUELA_PATERNA=>ArbolHelper::LABEL_PADRE_ABUELA_PATERNA,
				ArbolHelper::PARENTESCO_MADRE_ABUELA_PATERNA=>ArbolHelper::LABEL_MADRE_ABUELA_PATERNA,
				ArbolHelper::PARENTESCO_PADRE_ABUELO_PATERNO=>ArbolHelper::LABEL_PADRE_ABUELO_PATERNO,
				ArbolHelper::PARENTESCO_MADRE_ABUELO_PATERNO=>ArbolHelper::LABEL_MADRE_ABUELO_PATERNO,
				ArbolHelper::PARENTESCO_HERMANO_PADRE=>ArbolHelper::LABEL_HERMANO_PADRE,
				ArbolHelper::PARENTESCO_HERMANO_MADRE=>ArbolHelper::LABEL_HERMANO_MADRE,
		);



	/**
	 * @return array action filters
	 */
	public function filters()
	{
		return array(
			'accessControl', // perform access control for CRUD operations
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules()
	{
		return array(
			array('allow',  // allow all users to perform 'list' and 'show' actions
				'actions'=>array('list','show','listParientes'),
				'users'=>array('*'),
			),
			array('allow', // allow authenticated user to perform 'create' and 'update' actions
				'actions'=>array('create','update'),
				'users'=>array('@'),
			),
			array('allow', // allow admin user to perform 'admin' and 'delete' actions
				'actions'=>array('admin','delete'),
				'users'=>array('admin'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	/**
	 * Shows a particular persona.
	 */
	public function actionShow()
	{
		$persona=$this->loadpersona();
		$this->render('show',array('persona'=>$persona));
	}

	/**
	 * Creates a new persona.
	 * If creation is successful, the browser will be redirected to the 'show' page.
	 */
	public function actionCreate()
	{
		$persona=new persona;
		$consultante=new consultante;
		$parentesco=new parentesco;
		if(isset($_GET['tipoId'])){
			$parentesco->tipo=$_GET['tipoId'];
		}
		$tipos=$this->listaTipos();
		if(isset($_GET['consultanteId'])){
			$consultanteId=$_GET['consultanteId'];
			$consultante=consultante::model()->findbyPk($consultanteId);
		}
		if(isset($_POST['consultante']))
		{
			$consultante->attributes=$_POST['consultante'];
        } 
		if(isset($_POST['persona']))
		{
			$persona->attributes=$_POST['persona'];
			$persona->foto=CUploadedFile::getInstance($persona,'foto');
			if ($persona->foto instanceof Object) {
				$persona->foto->saveAs(Yii::app()->getBasePath().'/images/'.$persona->id.'.jpg');
			}
			if(isset($_POST['parentesco']))
			{
				$parentesco->tipo = $_POST['parentesco']['tipo'];
				$parentesco->consultanteId=$consultanteId;
				// FIXME: está fallando al salvar
				if($persona->save()) {
					//$persona->foto->saveAs('/tmp/'.$persona->id.'.jpg');
					$parentesco->personaId=$persona->id;
					if ($parentesco->save()) {
						$this->redirect(array('/consultante/arbol','id'=>$consultante->id));
						//$this->redirect(array('show','id'=>$persona->id,'consultanteId'=>$consultanteId));
					}
				}
			}
		}
		$this->render('create',array('persona'=>$persona,'parentesco'=>$parentesco,'tipos'=>$tipos));
	}

	/**
	 * Updates a particular persona.
	 * If update is successful, the browser will be redirected to the 'show' page.
	 */
	public function actionUpdate()
	{
		if (isset($_POST['persona'])){
			$persona=new persona;
			$persona->attributes=$_POST['persona'];
			if ($persona->id !=null) {
				$persona->isNewRecord=false;
				$persona->setScenario('update');
			}
		} else {
			$persona=$this->loadpersona();
		}	
		$consultante=new consultante;
		$parentesco=new parentesco;		
		if(isset($_GET['tipoId'])){
			$parentesco->tipo=$_GET['tipoId'];
		}
		$tipos=$this->listaTipos();
		if(isset($_GET['consultanteId'])){
			$consultanteId=$_GET['consultanteId'];
			$consultante=consultante::model()->findbyPk($consultanteId);
		}
		if(isset($_POST['consultante']))
		{
			$consultante->attributes=$_POST['consultante'];
        } 		
		if(isset($_POST['persona']))
		{
			if ($persona->fecha_nacimiento=="" || $persona->fecha_nacimiento=="0000-00-00"){
				$persona->fecha_nacimiento=null;
			}
			if ($persona->fecha_fallecimiento=="" || $persona->fecha_fallecimiento=="0000-00-00"){
				$persona->fecha_fallecimiento=null;
			}
			$foto=CUploadedFile::getInstance($persona,'fotoSubida');
			if ($foto!=null) {
				$persona->foto=$foto;
		    	$persona->foto->saveAs(Yii::app()->getBasePath().'/../images/'.$persona->id.'.jpg');		
			}	
			if(isset($_POST['parentesco']))
			{
				$parentesco->tipo = $_POST['parentesco']['tipo'];
				$parentesco->consultanteId=$consultanteId;
				if($persona->save()) {
					$this->redirect(array('/consultante/arbol','id'=>$consultante->id));
						//$this->redirect(array('show','id'=>$persona->id,'consultanteId'=>$consultanteId));
				}
			}			
		}
		$this->render('update',array('persona'=>$persona,'parentesco'=>$parentesco,'tipos'=>$tipos));
	}

	/**
	 * Deletes a particular persona.
	 * If deletion is successful, the browser will be redirected to the 'list' page.
	 */
	public function actionDelete()
	{
		if(Yii::app()->request->isPostRequest)
		{
			// we only allow deletion via POST request
			$this->loadpersona()->delete();
			$this->redirect(array('list'));
		}
		else
			throw new CHttpException(500,'Invalid request. Please do not repeat this request again.');
	}

	/**
	 * Lists all personas.
	 */
	public function actionList()
	{
		$criteria=new CDbCriteria;

		$pages=new CPagination(persona::model()->count($criteria));
		$pages->pageSize=self::PAGE_SIZE;
		$pages->applyLimit($criteria);

		$personaList=persona::model()->findAll($criteria);

		$this->render('list',array(
			'personaList'=>$personaList,
			'pages'=>$pages,
		));
	}
	
	
	/**
	 * Lists all personas parientes de un consultante.
	 */
	public function actionListParientes()
	{
		$criteria=new CDbCriteria;

		$pages=new CPagination(persona::model()->count($criteria));
		$pages->pageSize=self::PAGE_SIZE;
		$pages->applyLimit($criteria);
		if(isset($_GET['consultanteId'])){
			$consultanteId=$_GET['consultanteId'];
			if(isset($_GET['parentesco'])){
				$parentesco=$_GET['parentesco'];
			
				$personaList=consultante::model()->with('parientes')->
					findAllByAttributes(array('tipo'=>$parentesco,'consultanteId'=>$consultanteId))->parientes;
				
			} else {			
				$personaList=consultante::model()->with('parientes')->findbyPk($consultanteId)->parientes;
			}
			$persona=consultante::model()->with('persona')->findbyPk($consultanteId)->persona;
		}
		$this->render('list',array(
			'personaList'=>$personaList,
			'pages'=>$pages,
		));
	}
	
	
	/**
	 * Manages all personas.
	 */
	public function actionAdmin()
	{
		$this->processAdminCommand();

		$criteria=new CDbCriteria;

		$pages=new CPagination(persona::model()->count($criteria));
		$pages->pageSize=self::PAGE_SIZE;
		$pages->applyLimit($criteria);

		$sort=new CSort('persona');
		$sort->applyOrder($criteria);

		$personaList=persona::model()->findAll($criteria);

		$this->render('admin',array(
			'personaList'=>$personaList,
			'pages'=>$pages,
			'sort'=>$sort,
		));
	}

	/**
	 * Returns the data model based on the primary key given in the GET variable.
	 * If the data model is not found, an HTTP exception will be raised.
	 * @param integer the primary key value. Defaults to null, meaning using the 'id' GET variable
	 */
	public function loadpersona($id=null)
	{
		if($this->_persona===null)
		{
			if($id!==null || isset($_GET['id']))
				$this->_persona=persona::model()->with('consultante')->findbyPk($id!==null ? $id : $_GET['id']);
			if($this->_persona===null)
				throw new CHttpException(500,'The requested persona does not exist.');
		}
		return $this->_persona;
	}

	/**
	 * Returns the data model based on the primary key given in the GET variable.
	 * If the data model is not found, an HTTP exception will be raised.
	 * @param integer the primary key value. Defaults to null, meaning using the 'id' GET variable
	 */
	public function loadconsultante($persona)
	{
		if($persona!=null)
		{
			$consultante=$persona->$consultante;
		}
		return $consultante;
	}
	
	/**
	 * Devuelve un array con la lista de tipos de parentesco para mostrar en el formulario	
	 */
	public function listaTipos()
	{
		return $this->_tipos;
	}

	/**
	 * Executes any command triggered on the admin page.
	 */
	protected function processAdminCommand()
	{
		if(isset($_POST['command'], $_POST['id']) && $_POST['command']==='delete')
		{
			$this->loadpersona($_POST['id'])->delete();
			// reload the current page to avoid duplicated delete actions
			$this->refresh();
		}
	}
	
	/**
	 * Lists all personas parientes de un consultante.
	 */
	public function listParientesPorParentescoYConsultante($consultanteId,$parentesco)
	{			
		$personaList=consultante::model()->with('parientes')->
					findAllByAttributes(array('tipo'=>$parentesco,'consultanteId'=>$consultanteId))->parientes;
		return $personaList;
	}
	
	public function parienteRellenaValoresPorDefecto(&$persona, $parentesco){
		$consultanteId=$_GET['consultanteId'];
		$parentesco->consultanteId=$consultanteId;
		$consultante=consultante::model()->with('persona')->findbyPk($consultanteId);
		
		if ($parentesco->tipo==ArbolHelper::PARENTESCO_HERMANO){
			$persona->apellido1=$consultante->persona->apellido1;	
			$persona->apellido2=$consultante->persona->apellido2;
		}
		
		if ($parentesco->tipo==ArbolHelper::PARENTESCO_PADRE){
			$persona->apellido1=$consultante->persona->apellido1;
			//$abuelo=persona::model()->findByPk()
		}
		if ($parentesco->tipo==ArbolHelper::PARENTESCO_MADRE){
			$persona->apellido1=$consultante->persona->apellido2;
		}
		// TODO: incluir lógica de apellidos
		
	}
}
